package com.demo.cms.listener;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.context.ApplicationContext;

import com.demo.Constants;
import com.demo.common.StringUtils;
import com.demo.core.model.Config;
import com.demo.core.model.Site;
import com.demo.core.service.DocumentService;
import com.demo.core.service.base.ConfigService;
import com.demo.webapp.cache.model.WebCacheModel;
import com.demo.webapp.cache.service.WebCacheService;
import com.demo.webapp.listener.StartupListener;

import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;

import java.util.List;
import java.util.Map;
import java.util.Properties;

/**
 * 初始化容器监听器<br>
 * 对web容器所需要的内容进行处理
 * 
 * @author ryuu.kk
 *
 */
public class CmsStartupListener extends StartupListener implements ServletContextListener {
	
	/**
	 * 日志对象
	 */
    private static final Log LOG = LogFactory.getLog(CmsStartupListener.class);
    
	/**
	 * 文档管理服务名
	 */
	private static String DOCUMENT_BEAN_NAME = "documentService";
	
    /**
     * 析构函数
     * @param ServletContextEvent application应用上下文事件
     */
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
    	//
       super.contextDestroyed(servletContextEvent);
       
    }
    
    //允许匿名评论
    private boolean anonymousReply(Long siteId, ConfigService configService) {
    	// 默认不允许匿名用户进行评论
    	boolean allow = false;
		// 得到当前访问的站点
    	Config config = configService.find(siteId, Constants.ARTICLE_REPLY_ANONYMOUS);
    	if (config != null) {
    		allow = Boolean.getBoolean(config.getValue());
    	}
    	// 
    	return allow;
    }
    
    //评论是否需要审核
    private boolean checkReply(Long siteId, ConfigService configService) {
    	// 默认不需要审核
    	boolean check = false;
    	
    	Config config = configService.find(siteId, Constants.ARTICLE_REPLY_CHECKED);
    	if (config != null) {
    		check = Boolean.getBoolean(config.getValue());
    	}
    	// 
    	return check;
    }
    
    //创建文件夹
    private void folderBuilder(Map<String, Object> config, ApplicationContext ctx) {
    	// 由于站点资源有Site的指定,原始由配置模式被注释  at 2013-07-02
    	
//    	DocumentService documentService = ctx.getBean(DOCUMENT_BEAN_NAME, DocumentService.class);
    	
    	//公共目录不存在,抛出异常
//    	if (!documentService.folderExists(Constants.PUBLISH_FOLDER_UUID)) {
    		//throw new FolderNotFoundException(Constants.PUBLISH_FOLDER_UUID + " not found.");
//    	}    	
//    	documentService.folderExists(9L);
//    	Folder folder = new Folder();
//    	UUID.randomUUID().toString().replaceAll("-", "");
//    	
//    	folder.setName(Constants.PUBLISH_FOLDER_NAME);
//    	//folder.setOwnerSid(ownerSid);
//    	
//    	folder.setEnabled(true);
//    	//顶级目录
//    	folder.setPid(null);
//    	//设置优先级(如果是先序遍历树,则该字段似乎无意义)
//    	folder.setPriority(0);
//    	//文档类型：系统内置
//    	folder.setType(Folder.TYPE_INNER);
//    	//文档不可见
//    	folder.setStatus(Folder.STATUS_HIDE);
//    	folder.setSiteId(MultisiteContextHolder.getSite().getId());
    	
    	//将公共文件夹模型存入应用配置
    	//LOG.info("query publish folder [" + Constants.PUBLISH_FOLDER_KEY + "] in DB");
    	//config.put(Constants.PUBLISH_FOLDER_KEY, documentService.findFolder(Constants.PUBLISH_FOLDER_UUID));
    }
    
	@Override
	protected Map<String, Object> onSiteInitialized(Site site, Map<String, Object> siteConfig) {
		
    	/*************************************************************
    	 * 
    	 *   CMS启动的基本数据加载
    	 *           
    	 *   1.加载站点基本配置信息
    	 *   2.创建内置管理员账户,并分配管理权限
    	 *   3.创建应用数据：
    	 *     ①、CMS公共目录创建
    	 *     ②、CMS应用授权功能(站点功能分配)
    	 *     ③、导入一个预览的基础数据
    	 *   4.读取info.properties信息
    	 * 
    	 *************************************************************/
		
		// 得到容器
		ApplicationContext ctx = getApplicationContext();
		// 获得基础配置文件
		Properties properties = (Properties) ctx.getBean("appProperties");
    	
    	//读取和设置基本配置参数
    	ConfigService configService = ctx.getBean("configService", ConfigService.class);
    	
    	// 读取WebCache服务信息
    	WebCacheService<?> webCacheService = ctx.getBean("webCacheService", WebCacheService.class);
    	
    	if (LOG.isDebugEnabled()) {
    		LOG.debug(" *     ▪ 加载个性参数 ");
    	}
    	// 
    	// ①、读取允许匿名评论
    	boolean isAllow = anonymousReply(site.getId(), configService);
    	siteConfig.put(Constants.ARTICLE_REPLY_ANONYMOUS, isAllow);
    	// ②、评论是否需要审核
    	boolean isCheck = checkReply(site.getId(), configService);
    	siteConfig.put(Constants.ARTICLE_REPLY_CHECKED, isCheck);
    	// ③、得到站点资源
    	String resourcePath = site.getResPath();
    	if (StringUtils.isEmpty(resourcePath)) {
    		resourcePath = com.demo.webapp.config.Constants.DEFAULT_RESOURCE_PATH;
    	}
    	
    	//创建内置管理账户
    	
    	//对内置账户进行SID创建,分配管理权限
    	
    	//创建应用基础数据
    	
    	//创建CMS的公共文件夹目录
    	folderBuilder(siteConfig, ctx);
    	siteConfig.put(com.demo.webapp.config.Constants.PUBLISH_FOLDER_KEY, resourcePath);
    	
    	//读取系统版本等信息
    	siteConfig.put(Constants.APP_NAME, properties.get(Constants.APP_NAME));
    	siteConfig.put(Constants.APP_VERSION, properties.get(Constants.APP_VERSION));
    	// 需要修改
    	siteConfig.put(Constants.APP_LICENSE, properties.get(Constants.APP_LICENSE));
    	
    	//siteConfig.put(Constants.APP_CACHE_SWITCH, Boolean.valueOf(properties.get(Constants.APP_CACHE_SWITCH).toString()));
    	//siteConfig.put(Constants.APP_CACHE_ALLOW_URL, parseString(String.valueOf(properties.get(Constants.APP_CACHE_ALLOW_URL)), splitRegex));
    	//siteConfig.put(Constants.APP_CACHE_MODEL_LIST, buildWebCacheList(properties));
    	
    	// 是否允许web缓存
    	boolean allowCache = webCacheService.isAllow(site.getId());
    	// 得到web缓存
    	//List<WebCacheModel> webCacheList = webCacheService.queryCache(site.getId());
    	// 获得有效的缓存地址
    	String[] cacheUrls = webCacheService.cacheUrls(site.getId());
    	// 站点是否允许WEB缓存
    	siteConfig.put(com.demo.webapp.config.Constants.APP_WEBCACHE_SWITCH, allowCache);
    	// 允许缓存的地址
    	siteConfig.put(com.demo.webapp.config.Constants.APP_WEBCACHE_URL, cacheUrls);
    	
    	if (LOG.isDebugEnabled()) {
    		LOG.debug(" *       |- 允许匿名评论 ................... [" + (isAllow?"YES":"NO") + "].");
    		LOG.debug(" *       |- 允许审核评论 ................... [" + (isCheck?"YES":"NO") + "].");
    		LOG.debug(" *       |- 允许站点缓存 ................... [" + (allowCache?"YES":"NO") + "].");
    	}
		return siteConfig;
	}
}